아이템8
타입 공간과 값 공간의 심벌 구하기
- 심벌은 이름이 같더라도 속하는 공간에 따라 다른것을 나타낸다.
// 타입으로 쓰인 Cylinder
interface Cylinder {
radius: number;
height: number;
}
// 값으로 쓰인 Cylinder
const Cylinder = (radius: number, height: number) => ({ radius, height });
type이나interface다음에 나오는 심벌은 타입인 반면const나let선언에 쓰이는 것은 값이다.- 일반적으로
:뒤엔 type=뒤엔 값이 쓰인다.
일반적으로 typeof는 사용처에따라 다른 값을 반환한다.
interface Person {
first: string;
last: string;
}
const p: Person = { first: "JANE", last: "JACOBS" };
// typeof는 타입으로 쓰일 때와 값으로 쓰일 때가 다른 기능을 한다.
type T1 = typeof p; // 타입은 Person8
const v1 = typeof p; // 값은 'object' => 런타임의 typeof 연산자
console.log(v1);
InstanceType<>은 생성자 함수의 리턴타입을 반환한다.
const v = typeof Cylinder; // 값이 'function'
type T8 = typeof Cylinder; // 타입이 typeof Cylinder => === Cylinder 생성자 함수
// InstanceType: 생성자 함수의 리턴 타입을 얻는다.
// InstanceType 제네릭을 이용하여 생성자 타입과 인스턴스 타입을 전환할 수 있다.
type C = InstanceType<typeof Cylinder>; // 타입이 Cylinder
[]를 이용한 속성으 타입에 접근
const first: Person8["first"] = p["first"]; // []를 이용하여 속성의 타입에 접근 가능하다.
타입스크립트에서의 구조 분해 할당
function email({ person: Person, subject: string }) {}
- 위 코드는 값의 관점에서 Person과 String이 해석되었기 떄문에 오류가 발생한다.
- 이룰 해결 하기 위해선 타입과 값을 구분해줘야한다.
function email({ person, subject }: { person: Person; subject: string }) {}